// -*- Mode: java -*-
/* Copyright (c) 2006-2016, Universities Space Research Association (USRA).
 *  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Universities Space Research Association nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY USRA ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL USRA BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

Command print(...);
Command ack_msg(String);
Command quit_msg(String);

Real Lookup time;

// Allow the plan to succeed whether it is ended by a Quit message or a timeout
test_recv:
Concurrence
{
    Integer timeout = 30;        // Time out the run
    Boolean continue = true;    // Repeat the HandleCommand node
    Boolean send_ack = true;    // If true, send an ack for test_udp_msg

    ExitCondition !continue;
    HandleCommand:
    {
	RepeatCondition continue;

	ReceiveCommand:
	OnCommand "test_udp_msg" (String arg1,
				  Boolean arg2,
				  Integer arg3,
				  Real arg4,
				  Integer arg5[3],
				  Real arg6[3],
				  Boolean arg7[3],
				  String arg8[3])
	    {
		print ("\ntest_recv: received arg1==", arg1, ", arg2==", arg2, ", arg3==", arg3, ", arg4==", arg4,
		       ", arg5==", arg5, ", arg6==", arg6, ", arg7==", arg7,  ", arg8==", arg8, "\n\n");

		CheckForAckRequest:
		send_ack = arg2;
	    }
        
	SendCommandAck:
	UncheckedSequence
	{
	    SkipCondition !send_ack;
	    print ("\ntest_recv: sending ack\n\n");
	    ack_msg ("ack");
	}
    }

    HandleTimeout:
    {
	StartCondition Lookup(time, 1) > HandleCommand.EXECUTING.START + timeout;
	print ("\ntest_recv: timed out after ", timeout, " seconds\n\n");

	SignalTimeout:
	{
	    Priority 1;        // high number := low priority
	    continue = false;
	}
    }

    HandleQuitMessage:
    OnCommand "quit_msg" (String junk)
	{
	    print ("\ntest_recv: received quit command\n\n");

	    SignalQuit:
	    {
		Priority 0;        // low number := high priority
		continue = false;
	    }
	}
}

// EOF
